package com.xcf.leetcode;

/**
 * IntegerReverse <br>
 * leet code  刷题
 * 题链接如下：
 * https://leetcode-cn.com/problems/reverse-integer/
 * 给出一个 32 位的有符号整数，你需要将这个整数中每位上的数字进行反转。
 * <p>
 * 示例 1:
 * <p>
 * 输入: 123
 * 输出: 321
 *  示例 2:
 * <p>
 * 输入: -123
 * 输出: -321
 * 示例 3:
 * <p>
 * 输入: 120
 * 输出: 21
 * 注意:
 * <p>
 * 假设我们的环境只能存储得下 32 位的有符号整数，则其数值范围为 [−231,  231 − 1]。请根据这个假设，
 * 如果反转后整数溢出那么就返回 0。
 * <p>
 * 2147483647
 * 1646324359
 * <p>
 * -2147483648
 *
 * @author xiaocf <br>
 * @version 1.0 <br>
 * @date 2020/6/22 19:27 <br>
 */
public class IntegerReverse {

    /**
     * 暴力解法
     *
     * @param x
     */
    public int reverse(int x) {
        if (x == 0) {
            return 0;
        }
        int[] maxPos = {2, 1, 4, 7, 4, 8, 3, 6, 4, 7};
        int abs = Math.abs(x);
        int flag = x / abs;
        String s = String.valueOf(abs);
        char[] chars = s.toCharArray( );
        int[] pos = new int[chars.length];
        int posIndex = 0;
        for (int i = chars.length - 1; i >= 0; i--) {
            if (chars[i] != '-') {
                pos[posIndex++] = (chars[i] - 48);
            }
        }
        // 去掉尾部的0
        int start = 0;
        for (int i = pos.length - 1; i >= 0; i--) {
            if (pos[i] == 0) {
                start++;
            } else {
                break;
            }
        }

        int posLen = pos.length - start;
        if (posLen == maxPos.length) {
            // 可能越界
            for (int i = 0; i < pos.length; i++) {
                if (pos[i] > maxPos[i]) {
                    return 0;
                } else if (pos[i] < maxPos[i]) {
                    break;
                }
            }
        }
        int value = 0;
        for (int i = start; i < pos.length; i++) {
            int po = pos[i];
            int w = 1;
            for (int j = 0; j < posLen - i - 1; j++) {
                w = w * 10;
            }
            value = value + w * po;
        }
        return value * flag;
    }

    /**
     * 网友解法
     */
    public int reverse2(int x) {
        int ans = 0;
        while (x != 0) {
            if ((ans * 10) / 10 != ans) {
                return 0;
            }
            ans = ans * 10 + x % 10;
            x = x / 10;
        }
        return ans;
    }

    public static void main(String[] args) {
        IntegerReverse reverser = new IntegerReverse( );
        // 2143847412
        int reverse = reverser.reverse2(1534236469);
        System.out.println("reverse = " + reverse);
    }
}
